//身份证的好的有关封装
var idCardNoUtil = {
	provinceAndCitys: {
		11: "北京",
		12: "天津",
		13: "河北",
		14: "山西",
		15: "内蒙古",
		21: "辽宁",
		22: "吉林",
		23: "黑龙江",
		31: "上海",
		32: "江苏",
		33: "浙江",
		34: "安徽",
		35: "福建",
		36: "江西",
		37: "山东",
		41: "河南",
		42: "湖北",
		43: "湖南",
		44: "广东",
		45: "广西",
		46: "海南",
		50: "重庆",
		51: "四川",
		52: "贵州",
		53: "云南",
		54: "西藏",
		61: "陕西",
		62: "甘肃",
		63: "青海",
		64: "宁夏",
		65: "新疆",
		71: "台湾",
		81: "香港",
		82: "澳门",
		91: "国外"
	},
	powers: ["7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"],
	parityBit: ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"],
	genders: {
		male: "男",
		female: "女"
	},
	checkAddressCode: function (addressCode) {
		var check = /^[1-9]\d{5}$/.test(addressCode);
		if (!check)
			return false;
		if (idCardNoUtil.provinceAndCitys[parseInt(addressCode.substring(0, 2))]) {
			return true;
		} else {
			return false;
		}
	},
	checkBirthDayCode: function (birDayCode) {
		var check = /^[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))$/
			.test(birDayCode);
		if (!check)
			return false;
		var yyyy = parseInt(birDayCode.substring(0, 4), 10);
		var mm = parseInt(birDayCode.substring(4, 6), 10);
		var dd = parseInt(birDayCode.substring(6), 10);
		var xdata = new Date(yyyy, mm - 1, dd);
		if (xdata > new Date()) {
			return false; // 生日不能大于当前日期
		} else if ((xdata.getFullYear() == yyyy) &&
			(xdata.getMonth() == mm - 1) && (xdata.getDate() == dd)) {
			return true;
		} else {
			return false;
		}
	},
	getParityBit: function (idCardNo) {
		var id17 = idCardNo.substring(0, 17);

		var power = 0;
		for (var i = 0; i < 17; i++) {
			power += parseInt(id17.charAt(i), 10) *
				parseInt(idCardNoUtil.powers[i]);
		}

		var mod = power % 11;
		return idCardNoUtil.parityBit[mod];
	},
	checkParityBit: function (idCardNo) {
		var parityBit = idCardNo.charAt(17).toUpperCase();
		if (idCardNoUtil.getParityBit(idCardNo) == parityBit) {
			return true;
		} else {
			return false;
		}
	},
	checkIdCardNo: function (idCardNo) {
		// 15位和18位身份证号码的基本校验
		var check = /^\d{15}|(\d{17}(\d|x|X))$/.test(idCardNo);
		if (!check)
			return false;
		// 判断长度为15位或18位
		if (idCardNo.length == 15) {
			return idCardNoUtil.check15IdCardNo(idCardNo);
		} else if (idCardNo.length == 18) {
			return idCardNoUtil.check18IdCardNo(idCardNo);
		} else {
			return false;
		}
	},

	// 校验15位的身份证号码
	check15IdCardNo: function (idCardNo) {
		// 15位身份证号码的基本校验
		var check = /^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/
			.test(idCardNo);
		if (!check)
			return false;
		// 校验地址码
		var addressCode = idCardNo.substring(0, 6);
		check = idCardNoUtil.checkAddressCode(addressCode);
		if (!check)
			return false;
		var birDayCode = '19' + idCardNo.substring(6, 12);
		// 校验日期码
		return idCardNoUtil.checkBirthDayCode(birDayCode);
	},

	// 校验18位的身份证号码
	check18IdCardNo: function (idCardNo) {
		// 18位身份证号码的基本格式校验
		var check = /^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/
			.test(idCardNo);
		if (!check)
			return false;
		// 校验地址码
		var addressCode = idCardNo.substring(0, 6);
		check = idCardNoUtil.checkAddressCode(addressCode);
		if (!check)
			return false;
		// 校验日期码
		var birDayCode = idCardNo.substring(6, 14);
		check = idCardNoUtil.checkBirthDayCode(birDayCode);
		if (!check)
			return false;
		// 验证校检码
		return idCardNoUtil.checkParityBit(idCardNo);
	},

	formateDateCN: function (day) {
		var yyyy = day.substring(0, 4);
		var mm = day.substring(4, 6);
		var dd = day.substring(6);
		return yyyy + '-' + mm + '-' + dd;
	},

	// 获取信息
	getIdCardInfo: function (idCardNo) {
		var idCardInfo = {
			gender: "", // 性别
			birthday: "" // 出生日期(yyyy-mm-dd)
		};
		if (idCardNo.length == 15) {
			var aday = '19' + idCardNo.substring(6, 12);
			idCardInfo.birthday = idCardNoUtil.formateDateCN(aday);
			if (parseInt(idCardNo.charAt(14)) % 2 == 0) {
				idCardInfo.gender = idCardNoUtil.genders.female;
			} else {
				idCardInfo.gender = idCardNoUtil.genders.male;
			}
		} else if (idCardNo.length == 18) {
			var aday = idCardNo.substring(6, 14);
			idCardInfo.birthday = idCardNoUtil.formateDateCN(aday);
			if (parseInt(idCardNo.charAt(16)) % 2 == 0) {
				idCardInfo.gender = idCardNoUtil.genders.female;
			} else {
				idCardInfo.gender = idCardNoUtil.genders.male;
			}

		}
		return idCardInfo;
	},
	getId15: function (idCardNo) {
		if (idCardNo.length == 15) {
			return idCardNo;
		} else if (idCardNo.length == 18) {
			return idCardNo.substring(0, 6) + idCardNo.substring(8, 17);
		} else {
			return null;
		}
	},
	getId18: function (idCardNo) {
		if (idCardNo.length == 15) {
			var id17 = idCardNo.substring(0, 6) + '19' + idCardNo.substring(6);
			var parityBit = idCardNoUtil.getParityBit(id17);
			return id17 + parityBit;
		} else if (idCardNo.length == 18) {
			return idCardNo;
		} else {
			return null;
		}
	}
};;
(function ($) {
	$.extend({
		//验证手机号是否正确
		//parameter 1  需要验证的手机号
		'verifyPhone': function (param) {
			if (typeof param == 'string') {
				if (!$.trim(param)) return false;
				var phone = param;
				// var Reg = /^0?(17[0-9]|13[0-9]|15[0-9]|18[0-9]|14[57])[0-9]{8}$/;
				//var Reg = /^(13[0-9]|14[5-9]|15[012356789]|166|17[0-8]|18[0-9]|19[8-9])[0-9]{8}$/; //支持199手机号开头
				var Reg = /^[1][3,4,5,,6,7,8,9][0-9]{9}$/;
				return Reg.test(phone) ? true : false;
			} else {
				throw Error('传参类型错误');
			}
		},
		//密码验证
		'verifyPassword': function (param) {
			if (typeof param == 'string') {
				if (!$.trim(param)) return false;
				var password = param;
				var Reg = /^[a-zA-Z0-9]\w{5,17}$/;
				return Reg.test(password) ? true : false;
			} else {
				throw Error('传参类型错误');
			}
		},
		//验证邮箱是否合法
		//parameter 1  需要验证的邮箱
		'verifyEmail': function (param) {
			if (typeof param == 'string') {
				if (!$.trim(param)) return false;
				var email = param;
				var Reg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
				return Reg.test(email) ? true : false;
			} else {
				throw Error('传参类型错误');
			}
		},
		//去除空格
		'blank': function (param) {
			if (typeof param == 'string') {
				var paramStr = param.replace(/\s+/g, "")
				return paramStr
			} else {
				throw Error('传参类型错误');
			}
		},
		//判断是否为空   字符串或者对象都可以
		'isEmpty': function (param) {
			if (typeof param == 'string') param = $.trim(param);
			if (param == '' || typeof param == 'undefined' || param == null || param == undefined) {
				return true;
			} else {
				return false;
			}
		},
		//不能中文
		'isCheinese': function (param) {
			if (typeof param == 'string') {
				if (!$.trim(param)) return false;
				var password = param;
				var Reg = /.*[\u4e00-\u9fa5]+.*$/;
				return Reg.test(password) ? true : false;
			} else {
				throw Error('传参类型错误');
			}
		},
		//起码8位以上
		'isNumber': function (param) {
			if (typeof param == 'string') {
				if (!$.trim(param)) return false;
				var password = param;
				var Reg = /^\d{8,}$/
				return Reg.test(password) ? true : false;
			} else {
				throw Error('传参类型错误');
			}
		},
		//只能数字
		'mustNumber': function (param) {
			if (typeof param == 'string') {
				if (!$.trim(param)) return false;
				var password = param;
				var Reg = /^[0-9]*$/
				return Reg.test(password) ? true : false;
			} else {
				throw Error('传参类型错误');
			}
		},
		//匹配特殊符号
		'special': function (param) {
			if (typeof param == 'string') {
				if (!$.trim(param)) return false;
				var Reg = /['&']/
				return Reg.test(param) ? true : false;
			} else {
				throw Error('传参类型错误');
			}
		},
		//保留前三位 后面得*******
		'star': function (param) {
			if (typeof param == 'string') {
				var Reg = /^(\d{3})\d+(\d{4})$/
				// var Reg = /^(\d{4})\d+(\d{4})$/
				return param = param.replace(Reg, "$1********")
				// return param = param.replace(Reg, "$1****$2")
			} else {
				throw Error('传参类型错误');
			}
		},
		//检验身份证号
		'verifyIdCard': function (param) {
			if (typeof param == 'string') {
				if (!$.trim(param)) return false;
				var idCard = param;
				return idCardNoUtil.checkIdCardNo(idCard);
			} else {
				throw Error('传参类型错误');
			}
		},

		/**
		 * 格式化日期
		 * @param date  传递日期
		 * @param fmt   格式化的格式  yyyy:年  qq:季度 MM:月 HH:24小时 hh:12小时   m:分 s:秒  S:毫秒
		 **/
		'dateFormat': function (date, fmt) {
			if (arguments.length != 2) // 参数个数校验
				throw Error('arguments长度不合法');
			if (!date || (typeof date != 'object') || (date.constructor != Date)) // 参数合法性校验
				throw Error(arguments[0] + ':类型不为Date类型');
			if (/H+/.test(fmt) && /h+/.test(fmt))
				throw Error("小时格式错误，同类型只能连续出现一次！");
			/* 模板参数校验，正则验证方法 */
			var verify = function (Rex) {
				var arr = new RegExp(Rex).exec(fmt); // 获得匹配结果数组
				if (!arr) // 匹配失败返回
					return "";
				if (fmt.split(Rex).length > 2) // 同一类型间隔出现多次
					throw Error("fmt格式错误：同类型只能连续出现一次！");
				return arr[0];
			};
			var common = function (r, rex) {
				if (len != 1 && len != 2)
					throw Error("月份格式错误:M只能出现1/2次");
				len == 2 ? fmt = fmt.replace(rex, o[r].length == 1 ? "0" + o[r] : o[r]) : fmt = fmt.replace(rex, o[r]);
			}
			var o = { // 数据存储对象
				"y+": date.getFullYear() + "", // 年
				"q+": Math.floor((date.getMonth() + 3) / 3), // 季度
				"M+": date.getMonth() + 1 + "", // 月
				"d+": date.getDate() + "", // 日
				"H+": date.getHours() + "", // 24时
				"h+": date.getHours() + "", // 12时
				"m+": date.getMinutes() + "", // 分
				"s+": date.getSeconds() + "", // 秒
				"S+": date.getMilliseconds() // 毫秒
			}
			for (var r in o) {
				var rex, len, temp;
				rex = new RegExp(r);
				temp = verify(rex); // 匹配所得字符串
				len = temp.length; // 长度
				if (!len || len == 0)
					continue;
				if (r == "y+") {
					if (len != 2 && len != 4)
						throw Error("年份格式错误:y只能出现2/4次");
					len == 2 ? fmt = fmt.replace(rex, o[r].substr(2, 3)) : fmt = fmt.replace(rex, o[r]);
				} else if (r == "q+") {
					if (len != 1)
						throw Error("季度格式错误:q只能出现1次");
					fmt = fmt.replace(rex, o[r]);
				} else if (r == "h+") {
					if (len != 1 && len != 2)
						throw Error("小时格式错误:h只能出现1/2次");
					var h = (o[r] > 12 ? o[r] - 12 : o[r]) + "";
					len == 2 ? fmt = fmt.replace(rex, h.length == 1 ? "0" + h : h) : fmt = fmt.replace(rex, h);
				} else if (r == "S+") {
					if (len != 1)
						throw Error("毫秒数格式错误:S只能出现1次");
					fmt = fmt.replace(rex, o[r]);
				} else { // (r=="M+" || r=="d+" || r=="H+" || r=="m+" || r=="s+")
					common(r, rex)
				}
			}
			return fmt;
		}
	});




	/********************组件方法*****************************************************/

	$.fn.extend({

		//验证某个组件的值是否符合手机号规范
		'verifyPhone': function () {
			var phone = this.val() ? this.val() : this.text();
			return $.verifyPhone(phone);
		},

		//验证某个组件的值是否符合邮箱规范
		'verifyEmail': function () {
			var email = this.val() ? this.val() : this.text();
			return $.verifyEmail(email);
		}

	});
})(jQuery);